Each network operating system manufacturer has implemented its own networking protocols to provide the required networking functions. These protocols operate as distinct programs or processes that the network operating system uses to transport data between network nodes. Each set of programs is commonly referred to as a network protocol stack. While the underlying functionality of all network protocol stacks is similar, the implementation often differs. A network protocol stack generally refers to a set of layers (e.g., TCP, IP, etc.) through which all data passes at both client and server ends of a data exchange. One exemplary network protocol stack is the Transmission Control Protocol/Internet Protocol (TCP/IP) network protocol stack.
Processing capabilities of a server are generally limited by the number of central processing units (CPUs) in the server and the capabilities of each of the CPUs. In order to increase the capabilities of a server, it would seem logical to merely increase the number of CPUs in a single server. However, while a single CPU is costly, increasing the number of CPUS generally increases the cost of a server exponentially. Thus, increasing the number of CPUs is generally cost prohibitive.
Generally, the CPU of a server spends a substantial amount of time performing network processing, including processing performed by the network protocol stack. Specifically, a server can spend between 70 and 80 percent of its total CPU resources processing packets. As a result, little CPU resources remain for execution of an application.
One solution that has been implemented by various networking companies has been to introduce a protocol offload capable Network Interface Card (NIC) such as a TCP Offload Engine (TOE) capable NIC (i.e., TCP capable NIC) which can perform all network processing on the network card itself, leaving the CPU free to perform other processing. This has been a viable solution since adding one or more NICs is substantially less costly than increasing the number of CPUs. However, substantial latencies exist in setting up a network connection via a NIC, which can cause overall performance degradation. Moreover, short lived network connections consume valuable resources on the NIC that could be better utilized. In addition, a NIC may be incapable of supporting some network connections that require special processing capabilities. As a result, allowing the NIC to handle all network connections can be counter productive to performance.
In addition, a NIC suffers from periodic hardware failure. As a result, incoming packets handled by a faulty NIC could be erroneously dropped. Similarly, outbound packets handled by a failing NIC could irretrievably be lost.